from __future__ import absolute_import, division, print_function, unicode_literals
# TensorFlow and tf.keras
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from tensorflow import keras
# Helper libraries
import numpy as np
import matplotlib.pyplot as plt
![]() |
Figure 1. Fashion-MNIST samples (by Zalando, MIT License). |
Fashion MNIST ist als Ersatz für den klassischen Datensatz MNIST gedacht - oft als "Hello, World" von maschinellen Lernprogrammen für die Computer-Vision. Der MNIST-Datensatz enthält Bilder von handschriftlichen Ziffern (0, 1, 2, etc.) in einem identischen Format zu den Kleidungsstücken, die wir hier verwenden werden.
Dieser Leitfaden verwendet Fashion MNIST für Abwechslung und weil es ein etwas anspruchsvolleres Problem ist als normales MNIST. Beide Datensätze sind relativ klein und werden verwendet, um zu überprüfen, ob ein Algorithmus wie erwartet funktioniert. Sie sind gute Ausgangspunkte, um Code zu testen und zu debuggen.
Wir werden 60.000 Bilder verwenden, um das Netzwerk zu trainieren, und 10.000 Bilder, um zu bewerten, wie genau das Netzwerk gelernt hat, Bilder zu klassifizieren.
#Download Dataset and split in train images, train labels, test images, test labels
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
Label | Class |
---|---|
0 | T-shirt/top |
1 | Trouser |
2 | Pullover |
3 | Dress |
4 | Coat |
5 | Sandal |
6 | Shirt |
7 | Sneaker |
8 | Bag |
9 | Ankle boot |
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
train_images.shape
len(train_labels)
train_labels
Es befinden sich 10.000 Bilder im Testset. Auch hier wird jedes Bild als 28 x 28 Pixel dargestellt:
test_images.shape
Und das Testset enthält 10.000 Bild-Label:
len(test_labels)
plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()
train_images = train_images / 255.0
test_images = test_images / 255.0
Zeigen Sie die ersten 25 Bilder aus dem Trainingssatz an und zeigen Sie den Klassennamen unter jedem Bild an. Stellen Sie sicher, dass die Daten im richtigen Format vorliegen und wir sind bereit, das Netzwerk aufzubauen und zu trainieren.
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(train_images[i], cmap=plt.cm.binary)
plt.xlabel(class_names[train_labels[i]])
plt.show()
Der Grundbaustein eines neuronalen Netzwerks ist die Schicht. Schichten extrahieren Darstellungen aus den in sie eingegebenen Daten. Und hoffentlich sind diese Darstellungen für das jeweilige Problem sinnvoller.
Der größte Teil des tiefen Lernens besteht darin, einfache Schichten miteinander zu verbinden. Die meisten Layer, wie z.B. tf.keras.layers.Dense
, haben Parameter, die während des Trainings gelernt werden.
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.summary()
784*128 + 128 * 10 + 128 + 10
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
Um mit dem Training zu beginnen, rufen Sie die Methode "model.fit" auf - das Modell ist "fit" zu den Trainingsdaten:
model.fit(train_images, train_labels, epochs=5)
Während das Modell trainiert, werden die Verlust- und Genauigkeitsmetriken angezeigt. Dieses Modell erreicht eine Genauigkeit von etwa 93% auf die Trainingsdaten.
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
Mit dem trainierten Modell können wir damit Vorhersagen über einige Bilder treffen.
predictions = model.predict(test_images)
predictions[0]
np.argmax(predictions[0])
Label | Class |
---|---|
0 | T-shirt/top |
1 | Trouser |
2 | Pullover |
3 | Dress |
4 | Coat |
5 | Sandal |
6 | Shirt |
7 | Sneaker |
8 | Bag |
9 | Ankle boot |
plt.figure()
plt.imshow(test_images[0])
def plot_image(i, predictions_array, true_label, img):
predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
plt.imshow(img, cmap=plt.cm.binary)
predicted_label = np.argmax(predictions_array)
if predicted_label == true_label:
color = 'blue'
else:
color = 'red'
plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
100*np.max(predictions_array),
class_names[true_label]),
color=color)
def plot_value_array(i, predictions_array, true_label):
predictions_array, true_label = predictions_array[i], true_label[i]
plt.grid(False)
plt.xticks([])
plt.yticks([])
thisplot = plt.bar(range(10), predictions_array, color="#777777")
plt.ylim([0, 1])
predicted_label = np.argmax(predictions_array)
thisplot[predicted_label].set_color('red')
thisplot[true_label].set_color('blue')
#Note to myself: try image Nr.12
i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions, test_labels)
plt.show()
Lassen Sie uns mehrere Bilder mit ihren Vorhersagen plotten. Korrekte Vorhersagekennzeichen sind blau und falsche Vorhersagekennzeichen rot. Die Zahl gibt den Prozentsatz (von 100) für das vorhergesagte Etikett an. Beachten Sie, dass es auch bei großer Zuversicht falsch sein kann.
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
plt.subplot(num_rows, 2*num_cols, 2*i+1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(num_rows, 2*num_cols, 2*i+2)
plot_value_array(i, predictions, test_labels)
plt.show()
Verwenden Sie schließlich das trainierte Modell, um eine Vorhersage über ein einzelnes Bild zu machen.
# Grab an image from the test dataset
img = test_images[0]
print(img.shape)
tf.keras
Modelle sind optimiert, um Vorhersagen über eine Batch oder Sammlung von Beispielen auf einmal zu machen. Obwohl wir also ein einzelnes Bild verwenden, müssen wir es zu einer Liste hinzufügen:
# Add the image to a batch where it's the only member.
img = (np.expand_dims(img,0))
print(img.shape)
Prognostiziere nun das Bild:
predictions_single = model.predict(img)
print(predictions_single)
plot_value_array(0, predictions_single, test_labels)
plt.xticks(range(10), class_names, rotation=45)
plt.show()
model.predict
gibt eine Liste von Listen zurück, eine für jedes Bild im Datenstapel. Hol dir die Vorhersagen für unser (einziges) Bild im Stapel:
prediction_result = np.argmax(predictions_single[0])
print(prediction_result)
Und wie bisher prognostiziert das Modell ein Label von 9.